// lib/src/controller/omni_calendar_controller.dart
import 'package:flutter/material.dart';

enum SelectionType { single, range }

class OmniCalendarController extends ChangeNotifier {
  // 内部状态
  DateTime _displayedDate;
  DateTime? _startDate;
  DateTime? _endDate;
  bool _showLunar = true;
  SelectionType _selectionType = SelectionType.single;

  OmniCalendarController({
    DateTime? initialDate,
    SelectionType initialSelectionType = SelectionType.single,
  }) : _displayedDate = initialDate ?? DateTime.now() ,
        _selectionType = initialSelectionType{
    // 设置初始选中日期为当天
    _startDate = DateTime(
        _displayedDate.year, _displayedDate.month, _displayedDate.day);
  }

  // 外部查询的Getters
  DateTime get displayedDate => _displayedDate;
  DateTime? get selectedDate => (_selectionType == SelectionType.single) ? _startDate : null;
  DateTimeRange? get selectedDateRange {
    if (_selectionType == SelectionType.range && _startDate != null) {
      // 如果endDate为空（即范围选择未完成），返回一个单日范围
      final end = _endDate ?? _startDate!;
      return DateTimeRange(start: _startDate!, end: end);
    }
    return null;
  }

  bool get showLunar => _showLunar;
  SelectionType get selectionType => _selectionType;

  // 外部控制的方法
  void jumpToDate(DateTime date) {
    _displayedDate = DateTime(date.year, date.month, 1);
    notifyListeners();
  }

  // 允许外部动态设置选择模式
  void setSelectionType(SelectionType type) {
    if (_selectionType != type) {
      _selectionType = type;
      // 从范围切换到单选时，清除结束日期，只保留开始日期
      if (type == SelectionType.single) {
        _endDate = null;
      }
      // 模式切换时，最好重置选择，以避免不一致的状态
      // 如果您希望保留startDate，可以注释掉下面两行
      // _startDate = null;
      // _endDate = null;
      notifyListeners();
    }
  }


  // 内部方法，由UI/控件调用
  void toggleLunar(bool value) {
    if (_showLunar != value) {
      _showLunar = value;
      notifyListeners();
    }
  }

  void setDisplayedDate(DateTime date) {
    _displayedDate = DateTime(date.year, date.month, 1);
    // 由PageView滑动调用，它会触发重建。我们通知监听器以确保Header文本更新。
    notifyListeners();
  }

  void selectDate(DateTime date) {
    switch (_selectionType) {
      case SelectionType.single:
      // 单选模式逻辑：始终只更新 _startDate
        _startDate = date;
        _endDate = null; // 确保 _endDate 为空
        break;
      case SelectionType.range:
      // 范围选择模式逻辑
      // Case 1: 尚未选择任何日期，或已完成一次范围选择。
      // 将当前点击设为新的起始点。
        if (_startDate == null || (_startDate != null && _endDate != null)) {
          _startDate = date;
          _endDate = null;
        }
        // Case 2: 已经选择了一个起始点。
        else {
          // 如果点击了同一起始点，可以考虑取消选择或什么都不做。
          // 这里我们选择什么都不做，用户可以再次点击来开始新的选择。
          if (DateUtils.isSameDay(date, _startDate!)) {
            return; // 什么都不做
          }

          // 确定范围的开始和结束
          if (date.isBefore(_startDate!)) {
            _endDate = _startDate;
            _startDate = date;
          } else {
            _endDate = date;
          }
        }
        break;
    }
    notifyListeners();
  }
}
